#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <signal.h>

/*
 * 实现cat功能
 * 信号的方式，定时向终端输出文本信息
 * */

#define BUFFSIZE 128
#define CPS 10

static volatile int loop = 0;
static void alrm_handler(int s)
{
	alarm(1);
	loop = 1;
}

int main(int argc, char **argv)
{
	// output = 1; 表示向终端输出读出来的文本信息
	int input, output = 1;
	char buf[BUFFSIZE];
	int len, ret, pos;
	
	if(argc != 2){
		fprintf(stderr, "Usage.....\n");
		exit(1);
	}

	signal(SIGALRM,alrm_handler);
	alarm(1);

	do{
		input = open(argv[1], O_RDONLY);
		if(input < 0){
			if(errno != EINTR){
				perror("open()");
				exit(1);
			}
		}
	} while(input < 0);
	
	while(1){
		
		if(!loop){
			// 等待信息的进入
			pause();
		}
		loop = 0;

		len = read(input, buf, BUFFSIZE);
		if(len < 0){
			if(errno == EINTR){
				continue;
			}
			perror("read()");
			break;
		} else if(len == 0){
			break;
		}
		pos = 0;
		while(len > 0){
			ret = write(output, buf + pos, len);
			if(ret < 0){
				if(errno == EINTR){
					continue;
				}
				perror("write()");
				exit(1);
			}
			pos += ret; // 记录文件写入位置
			len -= ret; // 一次写不完，继续写入
		}
	}

	close(input);

	exit(0);
}
